package com.cglib.proxy;

import com.jdk.proxy.ProDao;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class ConsumerTest {
    public static void main(String[] args) {
        Producer producer = new Producer();
        producer.sellProduct(500f);
        System.out.println("---------");

        /**
         *
         * cglib动态代理
         *  1) cglib--Enhancer(核心类)--- 现在----当作为 ;jdk:Proxy
         *  2)里面有方法
         *          create
         *                  里面参数
         *                  参数1:当前被代理角色的字节码文件
         *                  参数2:CallBack 接口
         *
         *
         *                          接口作用:
         *                          子接口:MethodInteceptor
         *                              将业务方法进行拦截  ----理解为:jdk动态代理
         *                                                      invocationHander
         *
         */
        Producer pro = (Producer) Enhancer.create(producer.getClass(),
                new MethodInterceptor() {
                    /**
                     *
                     * @param proxy  代理对象的引用
                     * @param method  当前要执行的业务方法
                     * @param args 执行业务方法的总参数
                     *             -- 与jdk动态代理中invoke的参数一样
                     * @param methodProxy
                     * @return
                     * @throws Throwable
                     */
                    @Override
                    public Object intercept(Object proxy,
                                            Method method,
                                            Object[] args,
                                            MethodProxy methodProxy)
                            throws Throwable {
                        //声明Object
                        Object obj = null;
                        //反射:method,invoke(代理类的实例,方法中的实际参数)
                        //获取被代理类中业务方法参数 args
                        //现在业务方法中只有一个参数
                        Float money = (Float) args[0];
                        if ("sellProduct".equals(method.getName())) {
                            obj = method.invoke(producer, money * 0.8f);

                        }
                        return obj;
                    }
                });
        pro.sellProduct(50f);
    }
}
